package com.yangzc.lion.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.springframework.jdbc.core.JdbcTemplate;

import com.yangzc.lion.common.model.IBaseModel;
import com.yangzc.lion.common.tag.Page;

/**
 * DAO层基本接口方法
 * 
 * 
 * @param <T>
 *            实体
 * @param <PK>
 *            主键
 */
public interface IBaseDao<T extends IBaseModel, PK extends Serializable> {

	/**
	 * 将记录更新到数据库中。
	 * 
	 * @param modelObj
	 *            model对象
	 * @throws Exception
	 */
	JdbcTemplate getJdbcTemplate();

	abstract String add(T modelObj) throws RuntimeException;

	/**
	 * 根据model对象从数据库中删除记录。
	 * 
	 * @param modelObj
	 *            model对象
	 * @throws Exception
	 */
	abstract void delete(T modelObj) throws RuntimeException;

	/**
	 * 刷新Hibernate的Session
	 */
	void flushHibernateSession();

	/**
	 * 清空Hibernate的Session
	 * 
	 */
	void clearHibernateSession();

	T findByPrimaryKey(Class<T> modelInfo, String id, boolean noLazy)
			throws RuntimeException;

	/**
	 * 根据主键查找记录。
	 * 
	 * @param id
	 * @return model对象
	 * @throws Exception
	 */
	abstract T findByPrimaryKey(String id) throws RuntimeException;

	/**
	 * 根据主键查找记录
	 * 
	 * @param id
	 * @param modelInfo
	 *            域模型信息，可以是域模型的Class，也可以是域模型的全称，若值为null则取xml配置的信息
	 * @param noLazy
	 *            为true则强制从数据库中读取，不做性能优化
	 * @return
	 * @throws Exception
	 */
	abstract T findByPrimaryKey(String id, boolean noLazy)
			throws RuntimeException;

	/**
	 * 根据主键数组查找记录列表。
	 * 
	 * @param ids
	 * @return model对象列表
	 * @throws Exception
	 */
	abstract List<T> findByPrimaryKeys(String[] ids) throws RuntimeException;

	/**
	 * 将记录更新到数据库中。
	 * 
	 * @param modelObj
	 *            model对象
	 * @throws Exception
	 */
	abstract void update(T modelObj) throws RuntimeException;

	/**
	 * @return HibernateSession
	 */
	abstract Session getHibernateSession();

	List<T> find(String hql, Map<String, Object> param, Integer page,
			Integer pagesize);

	List<T> find(String hql, Map<String, Object> param);

	List<T> find(String hql);

	Object findObject(String hql, Map<String, Object> param,
			Integer firstResult, Integer rows);

	Object findObject(String hql, Map<String, Object> param);

	Object findObject(String hql);

	List<?> findObjects(String hql, Map<String, Object> param,
			Integer firstResult, Integer rows);

	List<?> findObjects(String hql, Map<String, Object> param);

	List<?> findObjects(String hql);

	Page<T> findPage(HQLInfo hqlInfo);

	Page<Map<String, Object>> findObjectPage(HQLInfo hqlInfo);

	Integer executeHql(String hql, Map<String, Object> param);

	Integer executeHql(String hql);
	
	List findList(HQLInfo hqlInfo);
	
	List findList(String whereBlock, String orderBy);

}